package com.levi.orderly;

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;

import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * 顺序消息发送生产者
 * 顺序消息的本质是，订单id一样的消息进入同一个消息队列，这样就保证了消息的局部有序
 */
public class OrderlyProducer {
    public static void main(String[] args) throws Exception{
        //创建生产者
        DefaultMQProducer producer = new DefaultMQProducer("group1");
        //指定namesrv
        producer.setNamesrvAddr("124.220.27.193:9876");
        //开启生产者
        producer.start();
        //发送消息
        List<OrderStemp> orderList = OrderStemp.buildOrder();
        for (int i = 0; i <orderList.size() ; i++) {
            String msg = orderList.get(i)+"";
            Message message = new Message("OrderTopic", "Order", msg.getBytes(StandardCharsets.UTF_8));
            /**
             * 参数一:消息对象
             * 参数二:消息队列选择器
             * 参数三:业务标识id
             */
            SendResult sendResult = producer.send(message, new MessageQueueSelector() {
                /**
                 *
                 * @param mqs  消息队列集合，从中选择一个
                 * @param msg  消息   发送的消息
                 * @param arg  业务标识id  根据id判断消息进入哪一个队列中
                 * @return
                 */
                @Override
                public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
                    //FIXME 对订单id进行取模，选择消息进入哪一个队列
                    Integer orderId = (Integer) arg;
                    Integer index = orderId % mqs.size();
                    return mqs.get(index);
                }
            }, orderList.get(i).getOrderId());
            System.out.println("发送结果: "+sendResult);
        }
        producer.shutdown();
    }
}
